home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / hahen.lzh / enemy.c < prev    next >
C/C++ Source or Header  |  1999-05-28  |  6KB  |  305 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10. #define SEQ_WING_ERASE    67
  11.  
  12. #define ENEMY_MAX    64    /* 最大数 */
  13.  
  14. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  15. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  16.  *enemy_null_top,        /* 空のワークのリスト */
  17.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  18.  
  19.  
  20. typedef struct _spwork {
  21.     signed short x, y;    /* 座標 */
  22.     unsigned short pt;    /* スプライトパターンNo. */
  23.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  24. } SPWORK;
  25.  
  26. static SPWORK spwork;
  27.  
  28.  
  29. int EnemyInit0 (void)
  30. {
  31.     int i;
  32.  
  33.     /* リストをつなげる */
  34.     enemy_top = NULL;
  35.     enemy_end = NULL;
  36.     enemy_null_top = enemy;
  37.     for (i = 0; i < ENEMY_MAX; i++)
  38.         enemy[i].next = &enemy[i + 1];
  39.  
  40.     enemy[ENEMY_MAX - 1].next = NULL;
  41.  
  42.     return (0);
  43. }
  44.  
  45.  
  46.  
  47. void EnemyInit (unsigned short type, unsigned short info,
  48.         signed short ox, signed short oy, ENEMY * parent)
  49. {
  50.     ENEMY *p;
  51.  
  52.     if (enemy_null_top == NULL) {
  53.         printf ("ワークが一杯です\n");
  54.         return;        /* 空きのワークがない(キャラクターオーバー) */
  55.     }
  56.     /* リストの末尾に新しいノードを追加 */
  57.     p = enemy_null_top;
  58.     enemy_null_top = p->next;
  59.     if (enemy_top == NULL)
  60.         enemy_top = p;
  61.     else
  62.         enemy_end->next = p;
  63.     p->next = NULL;
  64.     enemy_end = p;
  65.  
  66.     p->type = type;
  67.     p->info = info;
  68.     p->ox = ox;
  69.     p->oy = oy;
  70.     p->x = p->y = 0;
  71.     p->parent = parent;
  72.  
  73.     p->lx = p->ly = p->lz = 0.0;
  74.     p->vx = p->vy = p->vz = 0.0;
  75.     p->cyc = 0;
  76.     p->cyc1 = 0;
  77.     p->round = p->round_v = p->spring = p->spring_v = 0.0;
  78.  
  79.     if (drand ()> 0.50)
  80.         p->info ^= 0x8000;    /* 上下反転 */
  81.  
  82.     switch (type) {
  83.     case 0:
  84.     case 1:
  85.     case 2:
  86.     case 3:
  87.     case 4:
  88.     case 5:
  89.     case 6:
  90.     case 7:
  91.         p->lx = drand ()* 16.0 - 8.0;
  92.         p->ly = drand ()* 16.0 - 8.0;
  93.         p->vx = p->lx / 1.5;
  94.         p->vy = p->ly / 1.5;
  95.         p->cyc1 = drand ()* 6.0 + 2.0;
  96.         break;
  97.     case 8:
  98.     case 9:
  99.         p->lx = drand ()* 16.0 - 8.0;
  100.         p->ly = drand ()* 16.0 - 8.0;
  101.         p->vx = p->lx / 2.0;
  102.         p->vy = p->ly / 2.0;
  103.         p->pt = 8;
  104.         p->cyc1 = drand ()* 64.0 + 8.0;
  105.         break;
  106.     default:
  107.         break;
  108.     }
  109. }
  110.  
  111.  
  112. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  113. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  114. {
  115.     short h;
  116.  
  117.     for (h = 0; h < sp_num; h++) {
  118.         p->x = p->lx + p->ox;
  119.         p->y = p->ly + p->oy;
  120.         if (p->parent != NULL) {
  121.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  122.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  123.         } else {
  124.             spwork.x = p->x + parts_table[h].x;
  125.             spwork.y = p->y + parts_table[h].y;
  126.         }
  127.         spwork.pt = parts_table[h].pt;
  128.         spwork.info = p->info;
  129.         spwork.x += (128 + 16);    /* 表示用に補正 */
  130.         spwork.y += (128 + 16);
  131.         xsp_set_st (&spwork);
  132.         fxsp_set_st (&spwork);
  133.         spwork.x -= (128 + 16);
  134.         spwork.y -= (128 + 16);
  135.     }
  136. }
  137.  
  138.  
  139.  
  140. void EnemyMove (void)
  141. {
  142.     ENEMY *p, *q;
  143.     double air_resist[8] =
  144.     {0.96, 0.94, 0.92, 0.90, 0.88, 0.88, 0.88, 0.88};
  145.  
  146.     p = enemy_top;
  147.     q = NULL;
  148.     while (p != NULL) {
  149.         char erase_flag = 0;
  150.  
  151.         switch (p->type) {
  152.         case 0:
  153.         case 1:
  154.         case 2:
  155.         case 3:
  156.         case 4:
  157.         case 5:
  158.         case 6:
  159.         case 7:
  160. #define    V2_MIN0    0.05        /* 速度の2乗がこれ以下になったら消去 */
  161.             p->lx += p->vx;
  162.             p->ly += p->vy;
  163.             if (l_option_flag == 0) {
  164.                 p->vx *= air_resist[p->type];    /* 空気抵抗 */
  165.                 p->vy *= air_resist[p->type];
  166.             } else {
  167.                 p->vx *= (air_resist[p->type]-0.03);    /* 空気抵抗 */
  168.                 p->vy *= (air_resist[p->type]-0.03);
  169.             }
  170.             if ((p->vx * p->vx + p->vy * p->vy) < V2_MIN0)
  171.                 erase_flag = !0;
  172.             p->cyc += p->cyc1;
  173.             if (p->cyc > 128)
  174.                 spwork.info = p->info;
  175.             else
  176.                 spwork.info = p->info ^ 0xc000;    /* 上下左右反転 */
  177.  
  178.             //DispSp (p, 1, parts0_table);
  179.             spwork.x = p->lx - 8;
  180.             spwork.y = p->ly - 8;
  181.             spwork.pt = p->type;
  182.             spwork.x += (128 + 16);    /* 表示用に補正 */
  183.             spwork.y += (128 + 16);
  184.             xsp_set_st (&spwork);
  185.             fxsp_set_st (&spwork);
  186.             spwork.x -= (128 + 16);
  187.             spwork.y -= (128 + 16);
  188.             break;
  189.  
  190.         case 8:
  191. #define    V2_MIN8    0.001        /* 速度の2乗がこれ以下になったら消去 */
  192.             p->lx += p->vx;
  193.             p->ly += p->vy;
  194.  
  195.             p->vx *= air_resist[2];    /* 空気抵抗 */
  196.             p->vy *= air_resist[2];
  197.             if ((p->vx * p->vx + p->vy * p->vy) < V2_MIN8)
  198.                 erase_flag = !0;
  199.             p->cyc += p->cyc1;
  200.             if (p->cyc > 128) {
  201.                 p->cyc -= 128;
  202.                 if (p->vx > 0) {
  203.                     p->pt++;
  204.                     if (p->pt > 15)
  205.                         p->pt = 8;
  206.                 } else {
  207.                     p->pt--;
  208.                     if (p->pt < 8)
  209.                         p->pt = 15;
  210.                 }
  211.             }
  212.             //DispSp (p, 1, parts0_table);
  213.             spwork.x = p->lx - 8;
  214.             spwork.y = p->ly - 8;
  215.             spwork.pt = p->pt;
  216.             spwork.info = p->info;
  217.             spwork.x += (128 + 16);    /* 表示用に補正 */
  218.             spwork.y += (128 + 16);
  219.             xsp_set_st (&spwork);
  220.             fxsp_set_st (&spwork);
  221.             spwork.x -= (128 + 16);
  222.             spwork.y -= (128 + 16);
  223.             break;
  224.  
  225.         case 9:
  226.             p->lx += p->vx;
  227.             p->ly += p->vy;
  228.  
  229.             p->vx *= air_resist[3];    /* 空気抵抗 */
  230.             p->vy *= air_resist[3];
  231.             if ((p->vx * p->vx + p->vy * p->vy) < V2_MIN8)
  232.                 erase_flag = !0;
  233.             p->cyc += p->cyc1;
  234.             if (p->cyc > 128) {
  235.                 p->cyc -= 128;
  236.                 if (p->vx > 0) {
  237.                     p->pt++;
  238.                     if (p->pt > 23)
  239.                         p->pt = 16;
  240.                 } else {
  241.                     p->pt--;
  242.                     if (p->pt < 16)
  243.                         p->pt = 23;
  244.                 }
  245.             }
  246.             //DispSp (p, 1, parts0_table);
  247.             spwork.x = p->lx - 8;
  248.             spwork.y = p->ly - 8;
  249.             spwork.pt = p->pt;
  250.             spwork.info = p->info;
  251.             spwork.x += (128 + 16);    /* 表示用に補正 */
  252.             spwork.y += (128 + 16);
  253.             xsp_set_st (&spwork);
  254.             fxsp_set_st (&spwork);
  255.             spwork.x -= (128 + 16);
  256.             spwork.y -= (128 + 16);
  257.             break;
  258.  
  259.         default:
  260.             printf ("enemy_move() : バグってます\n");
  261.             break;
  262.         }
  263.  
  264.         if (erase_flag) {
  265.             if (q == NULL) {    /* リストの一番最初を削除 */
  266.                 enemy_top = p->next;
  267.                 p->next = enemy_null_top;
  268.                 enemy_null_top = p;
  269.                 q = NULL;
  270.                 p = enemy_top;
  271.             } else {
  272.                 if (p == enemy_end) {    /* リストの一番最後を削除 */
  273.                     q->next = NULL;
  274.                     enemy_end = q;
  275.                     p->next = enemy_null_top;
  276.                     enemy_null_top = p;
  277.                     p = q->next;
  278.                 } else {
  279.                     q->next = p->next;
  280.                     p->next = enemy_null_top;
  281.                     enemy_null_top = p;
  282.                     p = q->next;
  283.                 }
  284.             }
  285.         } else {
  286.             q = p;
  287.             p = p->next;
  288.         }
  289.     }
  290. }
  291.  
  292.  
  293. void EnemyTini (void)
  294. {
  295.     int i;
  296.  
  297.     /* リストをつなげる */
  298.     enemy_top = NULL;
  299.     enemy_null_top = enemy;
  300.     for (i = 0; i < ENEMY_MAX; i++)
  301.         enemy[i].next = &enemy[i + 1];
  302.  
  303.     enemy[ENEMY_MAX - 1].next = NULL;
  304. }
  305.